﻿using MvcShoppingMall.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcShoppingMall.Models
{
   public partial class ShoppingCart
    {
        //数据库上下文
        ShoppingMallEntities storeDB = new ShoppingMallEntities();

        //购物车的标识
        int ShoppingCartId { get; set; }

        //用于在Seesion中保存当前用户的购物车标识
        public const string CartSessionKey = "CartId";

        //获取用户的购物车
        public static ShoppingCart GetCart(HttpContextBase context)
        {
            var cart = new ShoppingCart();
            //cart.ShoppingCartId = cart.GetCartId(context);
            return cart;
        }
        //简化购物车的辅助方法
        public static ShoppingCart GetCart(Controller controller)
        {
            return GetCart(controller.HttpContext);
        }
        //在购物车中加入商品
        public void AddToCart(wst_goods goods)
        {
            // 检查是否已经在购物车中
            var cartItem = storeDB.Carts.SingleOrDefault(
            c => c.CartId.Equals(ShoppingCartId)
            && c.goodsId == goods.goodsId);
            if (cartItem == null)
            {
                // 如果购物车中的商品不存在，创造一个
                cartItem = new Cart
                {
                    goodsId = goods.goodsId,
                    CartId = ShoppingCartId,
                    Count = 1,

                    DateCreate = DateTime.Now
                };
                storeDB.Carts.Add(cartItem);
            }
            else
            {
                // 如果商品已经存在，则在数量上添加一个
                cartItem.Count++;
            }
            // 保存到数据库
            storeDB.SaveChanges();
        }

        //移除商品
        public int RemoveFromCart(int id)
        {
            // 获取当前用户的购物车对象
            var cartItem = storeDB.Carts.Where(
            cart => cart.CartId == id).FirstOrDefault();

            int itemCount = 0;
            if (cartItem != null)
            {
                storeDB.Carts.Remove(cartItem);
                // 保存到数据库
                itemCount= storeDB.SaveChanges();
            }
            return itemCount;
        }

        //获取购物车中的购物项目
        public List<Cart> GetCartItems()
        {
            return storeDB.Carts.Where(cart => cart.CartId.Equals(ShoppingCartId)).ToList();
        }
        //获取项目个数
        public int GetCount()
        {
            //获取购物车中每个项目的计数并对其进行汇总。
            int? count = (from cartItems in storeDB.Carts
                          where cartItems.CartId == ShoppingCartId
                          select (int?)cartItems.Count).Sum();

            return count ?? 0;
        }
        //计算总价
        public decimal GetTotal()
        {
            // 通过商品的计数乘以商品价格
            // 购物车中每一商品的当前价格
            // 商品所有总和

            decimal? total = (from cartItems in storeDB.Carts
                              where cartItems.CartId == ShoppingCartId
                              select (int?)cartItems.Count * cartItems.wst_goods.shopPrice).Sum();
            return total ?? decimal.Zero;
        }
        //创建订单
        public int CreateOrder(order order)
        {
            decimal orderTotal = 0;
            var cartItems = GetCartItems();
            //遍历购物车中的项目，为每个用户添加订单明细。
            foreach (var item in cartItems)
            {
                var order_goods = new order_goods
                {
                    goodsId = item.goodsId,
                    orderId = order.OrderId,   //设置所属的订单
                    goodsPrice = item.wst_goods.shopPrice,
                    goodsNum = item.Count
                };
                // 为购物车建立订单总和
                orderTotal += (item.Count * item.wst_goods.shopPrice);
                storeDB.order_goods.Add(order_goods);
            }
            // 将订单总数设置为订单总数
            order.totalMoney = orderTotal;
            // 保存订单
            storeDB.SaveChanges();
            // 清空购物车
            //EmptyCart();
            //返回订单编号作为确认编号
            return order.OrderId;
        }

        // 我们使用HttpContextBase访问Cookie。
        public string GetCartId(HttpContextBase context)
        {
            if (context.Session[CartSessionKey] == null)
            {
                //如果当前还没有购物车
                //购物车需要进行区分
                //如果用户已经登录，那么，用户名就是购物车的标识
                if (!string.IsNullOrWhiteSpace(context.User.Identity.Name))
                {
                    context.Session[CartSessionKey] = context.User.Identity.Name;
                }
                else
                {
                    // 为匿名用户创建一个GUID

                    Guid tempCartId = Guid.NewGuid();
                    // 将tempCartId发送回客户端作为cookie
                    context.Session[CartSessionKey] = tempCartId.ToString();
                }
            }
            return context.Session[CartSessionKey].ToString();
        }
        // 当用户登录时，将他们的购物车迁移
        // 与用户名关联
        //合并购物车
        public void MigrateCart(string userName)
        {
            //找匿名用户原有的购物项目
            var shoppingCart = storeDB.Carts.Where(c => c.CartId == ShoppingCartId
                );
            //遍历所有的购物项目，将购物项目的所有人修改为当前登陆的用户
            foreach (Cart item in shoppingCart)
            {
                //item.CartId = userName;
            }
            storeDB.SaveChanges();
        }
    }

}